#!/usr/bin/env python
"""
前端资源下载脚本
用于下载Bootstrap、Font Awesome等前端资源到本地static目录
作为CDN的备用方案

使用方法:
python download_frontend_assets.py

作者: 教务系统开发团队
日期: 2025年
"""

import os
import requests
from pathlib import Path
import zipfile
import tempfile

# 项目根目录
BASE_DIR = Path(__file__).resolve().parent
STATIC_DIR = BASE_DIR / 'static'

# 创建必要的目录
CSS_DIR = STATIC_DIR / 'css' / 'vendor'
JS_DIR = STATIC_DIR / 'js' / 'vendor'
FONTS_DIR = STATIC_DIR / 'fonts'

def create_directories():
    """创建必要的目录结构"""
    for dir_path in [CSS_DIR, JS_DIR, FONTS_DIR]:
        dir_path.mkdir(parents=True, exist_ok=True)
    print("✓ 目录结构创建完成")

def download_file(url, dest_path, description=""):
    """下载文件到指定路径"""
    try:
        print(f"正在下载 {description}: {url}")
        response = requests.get(url, timeout=30)
        response.raise_for_status()
        
        with open(dest_path, 'wb') as f:
            f.write(response.content)
        print(f"✓ {description} 下载完成: {dest_path}")
        return True
    except Exception as e:
        print(f"✗ {description} 下载失败: {e}")
        return False

def download_bootstrap():
    """下载Bootstrap CSS和JS文件"""
    print("\n=== 下载Bootstrap资源 ===")
    
    # Bootstrap CSS
    bootstrap_css_url = "https://cdn.bootcdn.net/ajax/libs/bootstrap/5.1.3/css/bootstrap.min.css"
    download_file(
        bootstrap_css_url, 
        CSS_DIR / 'bootstrap.min.css',
        "Bootstrap CSS"
    )
    
    # Bootstrap JS
    bootstrap_js_url = "https://cdn.bootcdn.net/ajax/libs/bootstrap/5.1.3/js/bootstrap.bundle.min.js"
    download_file(
        bootstrap_js_url,
        JS_DIR / 'bootstrap.bundle.min.js',
        "Bootstrap JS"
    )

def download_fontawesome():
    """下载Font Awesome CSS文件"""
    print("\n=== 下载Font Awesome资源 ===")
    
    # Font Awesome CSS
    fontawesome_css_url = "https://cdn.bootcdn.net/ajax/libs/font-awesome/6.0.0/css/all.min.css"
    download_file(
        fontawesome_css_url,
        CSS_DIR / 'fontawesome.min.css',
        "Font Awesome CSS"
    )

def create_local_cdn_template():
    """创建使用本地资源的模板文件"""
    template_content = '''{% comment %}
本地CDN资源模板 - 使用本地下载的前端资源
当外部CDN不可用时使用此模板

使用方法：
1. 运行 python download_frontend_assets.py 下载资源
2. 在模板中使用 {% include 'local_cdn_config.html' %}
{% endcomment %}

{% load static %}

<!-- Bootstrap 5 CSS - 本地版本 -->
{% block bootstrap_css %}
<link href="{% static 'css/vendor/bootstrap.min.css' %}" rel="stylesheet">
{% endblock %}

<!-- Font Awesome - 本地版本 -->
{% block fontawesome_css %}
<link href="{% static 'css/vendor/fontawesome.min.css' %}" rel="stylesheet">
{% endblock %}

<!-- Bootstrap 5 JavaScript - 本地版本 -->
{% block bootstrap_js %}
<script src="{% static 'js/vendor/bootstrap.bundle.min.js' %}"></script>
{% endblock %}

<!-- 使用说明 -->
{% comment %}
如果需要切换回CDN版本，请：
1. 将 local_cdn_config.html 改为 cdn_config.html
2. 或直接在模板中引用CDN链接

性能提示：
- 本地资源加载更稳定，但会增加服务器带宽消耗
- CDN资源加载更快，但依赖网络状况
- 建议在生产环境中使用CDN + 本地备份的方案
{% endcomment %}
'''
    
    template_path = BASE_DIR / 'templates' / 'local_cdn_config.html'
    with open(template_path, 'w', encoding='utf-8') as f:
        f.write(template_content)
    print(f"✓ 本地CDN模板创建完成: {template_path}")

def create_cdn_settings():
    """创建CDN配置文件"""
    settings_content = '''"""
CDN配置设置
用于在不同环境下切换CDN源

使用方法：
from cdn_settings import CDN_CONFIG

在模板中：
{{ CDN_CONFIG.BOOTSTRAP_CSS }}
"""

class CDNConfig:
    """CDN配置类"""
    
    # BootCDN (字节跳动) - 国内主要CDN
    BOOTCDN = {
        'BOOTSTRAP_CSS': 'https://cdn.bootcdn.net/ajax/libs/bootstrap/5.1.3/css/bootstrap.min.css',
        'BOOTSTRAP_JS': 'https://cdn.bootcdn.net/ajax/libs/bootstrap/5.1.3/js/bootstrap.bundle.min.js',
        'FONTAWESOME_CSS': 'https://cdn.bootcdn.net/ajax/libs/font-awesome/6.0.0/css/all.min.css',
    }
    
    # Staticfile CDN (七牛云) - 备用CDN
    STATICFILE = {
        'BOOTSTRAP_CSS': 'https://cdn.staticfile.org/bootstrap/5.1.3/css/bootstrap.min.css',
        'BOOTSTRAP_JS': 'https://cdn.staticfile.org/bootstrap/5.1.3/js/bootstrap.bundle.min.js',
        'FONTAWESOME_CSS': 'https://cdn.staticfile.org/font-awesome/6.0.0/css/all.min.css',
    }
    
    # jsDelivr - 国际CDN
    JSDELIVR = {
        'BOOTSTRAP_CSS': 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css',
        'BOOTSTRAP_JS': 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js',
        'FONTAWESOME_CSS': 'https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.0.0/css/all.min.css',
    }

# 默认使用BootCDN
CDN_CONFIG = CDNConfig.BOOTCDN

# 可以根据环境变量或配置切换CDN源
# import os
# cdn_provider = os.getenv('CDN_PROVIDER', 'BOOTCDN')
# CDN_CONFIG = getattr(CDNConfig, cdn_provider, CDNConfig.BOOTCDN)
'''
    
    settings_path = BASE_DIR / 'cdn_settings.py'
    with open(settings_path, 'w', encoding='utf-8') as f:
        f.write(settings_content)
    print(f"✓ CDN配置文件创建完成: {settings_path}")

def main():
    """主函数"""
    print("🚀 开始下载前端资源...")
    
    # 创建目录结构
    create_directories()
    
    # 下载Bootstrap资源
    download_bootstrap()
    
    # 下载Font Awesome资源
    download_fontawesome()
    
    # 创建本地CDN模板
    create_local_cdn_template()
    
    # 创建CDN配置文件
    create_cdn_settings()
    
    print("\n✅ 前端资源下载完成！")
    print("\n📝 使用说明：")
    print("1. 外部CDN可用时：使用 cdn_config.html 模板")
    print("2. 外部CDN不可用时：使用 local_cdn_config.html 模板")
    print("3. 在Django settings.py中配置STATICFILES_DIRS以包含vendor目录")
    print("4. 运行 python manage.py collectstatic 收集静态文件")

if __name__ == '__main__':
    main()